class Agenda{
			private:
				Lista<Turno> turnosSemanales;
			public:
				Agenda();
				Agenda(Fecha,Hora,Hora);
				void cargarAgenda(Fecha,Hora,Hora);
				Turno  getTurno(Fecha, Hora);
				Lista<Turno> getTurnos(Fecha);
				Lista<Turno> getTurnosLibres();
				void addTurno(Fecha,Hora,unsigned char);
				void delTurno(Fecha,Hora);
				bool estaCargada();
                void imprimir();
};

Agenda::Agenda(){
			turnosSemanales.vaciar();
};
Agenda::Agenda(Fecha fecha,Hora horaEntrada,Hora horaSalida){
			turnosSemanales.vaciar();
			Dia diasLaborales[]={LUNES,MARTES,MIERCOLES,JUEVES,VIERNES,SABADO};
			Hora duracionTurno(0,15,0);
			for(int i=0;i<6;i++){
                Dia dia=diasLaborales[i];
				for(Hora hora=horaEntrada;hora<horaSalida;hora=hora+duracionTurno){
					Turno turno(fecha,dia,hora,0);
					turno.imprimir();
                    getche();
					turnosSemanales.insertar(turno,turnosSemanales.fin());
				}
				fecha=fecha+1;
			}
};

void Agenda::cargarAgenda(Fecha fecha,Hora horaEntrada,Hora horaSalida){
			turnosSemanales.vaciar();
			Hora duracionTurno(0,15,0);
			Dia diasLaborales[]={JUEVES,VIERNES,SABADO};
			for(int i=0;i<3;i++){
                Dia dia=diasLaborales[i];
				for(Hora hora=horaEntrada;hora<horaSalida;hora=hora+duracionTurno){
					Turno turno(fecha,dia,hora,0);
					turnosSemanales.insertar(turno,turnosSemanales.fin());
				}
				fecha=fecha+1;
		 }
};
Turno Agenda::getTurno(Fecha fecha, Hora hora){
		Turno t;
		posicion p;
		for(p=turnosSemanales.primer();
				p!=turnosSemanales.fin()&&
				(turnosSemanales.recuperar(p).getFecha()!=fecha||
				turnosSemanales.recuperar(p).getHora()!=hora);
				p=turnosSemanales.siguiente(p));

		return(p==turnosSemanales.fin()?t:turnosSemanales.recuperar(p));
};
Lista<Turno> Agenda::getTurnos(Fecha fecha){
		Lista<Turno> respuesta;
		for(posicion p=turnosSemanales.primer();
				p!=turnosSemanales.fin();
				p=turnosSemanales.siguiente(p)){
				if(turnosSemanales.recuperar(p).getFecha()==fecha)
						respuesta.insertar(turnosSemanales.recuperar(p),respuesta.fin());
		}
		return respuesta;
};
Lista<Turno> Agenda::getTurnosLibres(){
		Lista<Turno> respuesta;
		for(posicion p=turnosSemanales.primer();
				p!=turnosSemanales.fin();
				p=turnosSemanales.siguiente(p)){
				if(turnosSemanales.recuperar(p).getPaciente()==0)
						respuesta.insertar(turnosSemanales.recuperar(p),respuesta.fin());
		}
		return respuesta;
};
void Agenda::addTurno(Fecha fecha, Hora hora, unsigned char idPaciente){
		Turno turnoAsignado=getTurno(fecha,hora);
		turnoAsignado.setPaciente(idPaciente);
		turnosSemanales.modificarDato(turnosSemanales.localizar(getTurno(fecha,hora)),turnoAsignado);
};
void Agenda::delTurno(Fecha fecha, Hora hora){
		Turno turnoCancelado=getTurno(fecha,hora);
		turnoCancelado.setPaciente(0);
		turnosSemanales.modificarDato(turnosSemanales.localizar(turnoCancelado),turnoCancelado);
};
bool Agenda::estaCargada(){
		 return turnosSemanales.cantidad();
};
void Agenda::imprimir(){
  for(posicion p=turnosSemanales.primer();p!=turnosSemanales.fin();
            p=turnosSemanales.siguiente(p))
                turnosSemanales.recuperar(p).imprimir();
}


